/**
 * 权限表
 * 可以把一个接口作为一个权限
 */
const adminPermission = (sequelize, DataTypes) => {
  const AdminPermission = sequelize.define(
    'adminPermission',
    {
      name: {
        type: DataTypes.STRING,
        unique: true,
        allowNull: false,
        validate: {
          notEmpty: { args: true, msg: '权限名称必填' },
          len: { args: [2, 30], msg: '权限名称需要在2到30位之间' }
        }
      },
      interface: {
        type: DataTypes.STRING,
        unique: true,
        allowNull: false,
        validate: {
          notEmpty: { args: true, msg: '接口地址必填' }
        }
      },
      description: {
        type: DataTypes.STRING,
        unique: false,
        allowNull: true
      }
    },
    {
      freezeTableName: true, // 自定义表名
      tableName: 'admin_permission',
      timestamps: true, // 是否需要增加createdAt、updatedAt、deletedAt字段
      underscored: true, // 字段使用下划线，而不是驼峰式命名
      // 'paranoid': true, // 设置paranoid为true（此种模式下，删除数据时不会进行物理删除，而是设置deletedAt为当前时间
    }
  );

  // 模型关系
  AdminPermission.associate = models => {
    AdminPermission.belongsTo(models.AdminPermissionClassify, {
      foreignKey: 'classify_id',
      targetKey: 'id',
      as: 'classify'
    });
  };

  // 钩子函数
  AdminPermission.beforeBulkDestroy(async permission => {
    // console.log('Debug: adminPermission -> user', permission);
    // user.password = await user.generatePasswordHash();
  });

  /**
   * 用户名或者邮箱查重
   * @param {String} filed 需要被验证的字段
   * @param {String} value 需要被验证的字段的值
   * @param {*} self 去否忽略自己开始验证
   */
  AdminPermission.isRepeat = async (filed, value, self) => {
    const query = {};
    query[filed] = value;
    if (self) {
      const permissions = await AdminPermission.findAll({
        where: query,
        attributes: ['id']
      });
      return permissions.length >= 2;
    } else {
      return !!(await AdminPermission.findOne({
        where: query,
        attributes: ['id']
      }));
    }
  };

  return AdminPermission;
};

export default adminPermission;
